فرض کن یه هتل بزرگ داری که توش کلی اتاق (سرویس) هست. هر اتاق باید در زمان مشخصی باز و بسته بشه. توی سیستمهای قدیمی (SysVinit)، این کار با یه سری اسکریپت (مثل لیست کاغذی) انجام میشد. توی سیستمهای جدید (systemd)، مدیریت با یه نرمافزار هوشمند (systemctl) انجام میشه که خیلی سریعتر و منعطفتره. این جلسه دقیقاً همینه!
پس از بارگذاری هسته (Kernel)، اولین پردازشی که اجرا میشود، init است. این پردازش با PID 1 شناسایی میشود و مسئولیت راهاندازی و مدیریت تمام سرویسهای سیستم را بر عهده دارد. در طول تاریخ، دو روش اصلی برای این کار وجود داشته است: SysVinit (قدیمی) و systemd (جدید).
توضیح: با ps -p 1 میتوانید ببینید که اولین پردازش در سیستم شما systemd است (در توزیعهای جدید) یا init (در توزیعهای قدیمی).
systemd و در SysVinit نام آن init است.
systemd مدیر سرویسهای پیشفرض در اکثر توزیعهای مدرن لینوکس است. این سیستم از Unitها برای مدیریت همه چیز استفاده میکند.
هر چیزی که systemd مدیریت میکند، یک Unit است. انواع مختلف Unitها عبارتند از:
sshd.service)multi-user.target)
توضیح: systemctl list-units همه Unitهای فعال را نمایش میدهد. با --type=service فقط سرویسها را نشان میدهد.
Targetها گروههایی از سرویسها هستند که با هم راهاندازی میشوند. معادل Runlevelها در SysVinit هستند.
| نام Target | توضیح |
|---|---|
graphical.target |
سیستم با رابط گرافیکی (GUI) و شبکه |
multi-user.target |
سیستم با شبکه اما بدون GUI (چند کاربره) |
rescue.target |
حالت امداد (تککاربره) |
poweroff.target |
خاموش کردن سیستم |
reboot.target |
ریاستارت سیستم |
توضیح: systemctl get-default Target پیشفرض سیستم را نشان میدهد.
graphical.target و multi-user.target: اولی با GUI و دومی بدون GUI است.
فایلهای سرویس در /lib/systemd/system/ یا /etc/systemd/system/ قرار دارند و از سه بخش اصلی تشکیل شدهاند:
توضیح: systemctl cat ssh محتوای فایل سرویس ssh.service را نمایش میدهد.
After= → سرویس بعد از این سرویسها شروع شود.WantedBy= → سرویس توسط کدام Target مدیریت میشود.ExecStart= → دستور شروع سرویس.Type= → نوع سرویس (forking, notify, simple, etc.)هر فایل سرویس یک STATE دارد که مشخص میکند در زمان بوت چه اتفاقی برای آن میافتد:
| STATE | توضیح |
|---|---|
enabled |
سرویس در زمان بوت بهطور خودکار شروع میشود. |
disabled |
سرویس در زمان بوت شروع نمیشود. |
static |
سرویس فقط در صورت وابستگی سرویس دیگر شروع میشود یا میتوان بهصورت دستی شروع کرد. |
masked |
سرویس بهطور کامل غیرفعال است و حتی نمیتوان آن را بهصورت دستی شروع کرد. |
توضیح: systemctl list-unit-files وضعیت (STATE) همه فایلهای سرویس را نمایش میدهد.
enabled و disabled: enabled یعنی سرویس در بوت شروع میشود، disabled یعنی شروع نمیشود.
SysVinit سیستم مدیریت سرویسهای قدیمی است که هنوز در برخی توزیعها استفاده میشود. این سیستم از Runlevelها و اسکریپتهای /etc/init.d/ استفاده میکند.
Runlevelها وضعیتهای مختلف سیستم را تعیین میکنند:
| Runlevel | توضیح |
|---|---|
| 0 | خاموش کردن سیستم |
| 1 (S) | حالت تککاربره (تعمیر) |
| 2 | چند کاربره بدون شبکه |
| 3 | چند کاربره با شبکه |
| 4 | سفارشی (Custom) |
| 5 | چند کاربره با GUI |
| 6 | ریاستارت سیستم |
multi-user.target در systemd.graphical.target در systemd.
در SysVinit، سرویسها با دستور service مدیریت میشوند و اسکریپتهای آنها در /etc/init.d/ قرار دارند.
توضیح: service httpd status وضعیت سرویس را نشان میدهد و service httpd start آن را شروع میکند.
برای فعال کردن سرویس در زمان بوت، از chkconfig یا لینکهای سمبلیک در /etc/rc.d/ استفاده میشود.
توضیح: chkconfig httpd on سرویس را در Runlevelهای پیشفرض فعال میکند.
service برای مدیریت سرویسها و از chkconfig برای فعالسازی در بوت استفاده میشود.
systemctl.service در /lib/systemd/system/After, Before, Wants, Requiresgraphical.target, multi-user.targetservice و chkconfig/etc/init.d/0-6| دستور | توضیح |
|---|---|
halt |
تمام فرآیندها را متوقف کرده و CPU را خاموش میکند (اما برق را قطع نمیکند). |
poweroff |
تمام فرآیندها را متوقف کرده، CPU را خاموش و به سختافزار سیگنال قطع برق میفرستد. |
reboot |
سیستم را ریاستارت میکند. |
shutdown |
با گزینههای مختلف، سیستم را خاموش یا ریاستارت میکند (مثلاً shutdown -h now). |
halt و poweroff: halt فقط CPU را متوقف میکند، اما poweroff به سختافزار نیز سیگنال قطع برق میفرستد.
systemctl (start, stop, status, enable, disable)service (start, stop, status) و chkconfig (on, off)graphical.target (GUI) و multi-user.target (بدون GUI)systemd، در SysVinit = initpoweroff (خاموشی کامل)، reboot (ریاستارت)، halt (توقف CPU)